package edu.zut.lxc.loveime.recyclerView;


import android.content.Context;

import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.Scroller;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

// 请提供一个Java类，用于实现一个简单的RecyclerView。
public class SimpleRecycleView extends RecyclerView {
    // 类的实现代码
    private static final String TAG = "SimpleRecycleView";

    int mLastX =0 ;

    private Scroller mScroller;


    public SimpleRecycleView(@NonNull Context context) {
        super(context);
        init(context);
    }

    public SimpleRecycleView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context);

    }

    public SimpleRecycleView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);

    }

    private void init(Context context){
        mScroller = new Scroller(context);
    }

    @Override
    public void computeScroll() {
        if (mScroller!=null && mScroller.computeScrollOffset()){
            scrollBy(mLastX - mScroller.getCurrX(),0);

            mLastX = mScroller.getCurrX();
            postInvalidate();
        }
    }

    public void smoothScrollTo(int fx,int fy,int duration){
        int dx = 0;
        int dy = 0;
     }



        /**
         * 调用此方法设置滚动的相对偏移
         */
        public void smoothScrollBy(int dx, int dy, int duration) {
            if(duration > 0) {
                mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy, duration);
            } else {
                // 设置mScroller的滚动偏移量
                mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy);
            }
            // 重绘整个view，重绘过程会调用到computeScroll()方法。
            // 这里必须调用invalidate()才能保证computeScroll()会被调用，否则不一定会刷新界面，看不到滚动效果
            invalidate();
        }

        /**
         * 此方法用来检查自动调节
         *
         * @param position 要检查的位置
         */
        @SuppressWarnings("unused")
        public void checkAutoAdjust(int position){
            int childCount = getChildCount();
            // 获取可视范围内的选项的头尾位置
            int firstVisibleItemPosition = ((LinearLayoutManager) getLayoutManager()).findFirstVisibleItemPosition();
            int lastVisibleItemPosition = ((LinearLayoutManager) getLayoutManager()).findLastVisibleItemPosition();
            Log.d(TAG, "childCount:" + childCount + ", position:" + position + ", firstVisibleItemPosition:" + firstVisibleItemPosition
                    + "  lastVisibleItemPosition:" + lastVisibleItemPosition);
            if(position == (firstVisibleItemPosition + 1) || position == firstVisibleItemPosition){
                // 当前位置需要向右平移
                leftScrollBy(position, firstVisibleItemPosition);
            } else if (position == (lastVisibleItemPosition - 1) || position == lastVisibleItemPosition){
                // 当前位置需要向左平移
                rightScrollBy(position, lastVisibleItemPosition);
            }
        }

        private void leftScrollBy(int position, int firstVisibleItemPosition){
            View leftChild = getChildAt(0);
            if(leftChild != null){
                int startLeft = leftChild.getLeft();
                int endLeft = (position == firstVisibleItemPosition ? leftChild.getWidth() : 0);
                Log.d(TAG, "startLeft:" + startLeft + " endLeft" + endLeft);
                autoAdjustScroll(startLeft, endLeft);
            }
        }

        private void rightScrollBy(int position, int lastVisibleItemPosition){
            int childCount = getChildCount();
            View rightChild = getChildAt(childCount - 1);
            if(rightChild != null){
                int startRight = rightChild.getRight() - getWidth();
                int endRight = (position == lastVisibleItemPosition ? (-1 * rightChild.getWidth()) : 0);
                Log.d(TAG,"startRight:" + startRight + " endRight:" + endRight);
                autoAdjustScroll(startRight, endRight);
            }
        }

        /**
         *
         * @param start 滑动起始位置
         * @param end 滑动结束位置
         */
        private void autoAdjustScroll(int start, int end){
            mLastX = start;
            mScroller.startScroll(start, 0, end - start, 0);
            postInvalidate();
        }


        /**
         * 将指定item平滑移动到整个view的中间位置
         * @param position 指定的item的位置
         */
        public void smoothScrollMaster(int position) {
            // 这个方法是为了设置Scroller的滚动的，需要根据业务需求，编写算法。
        }




}
